package linear_list.seqlist;

import java.lang.reflect.Array;
import java.util.Arrays;

public class MyArray {
    //顺序表的参数
    private int[] arr;
    private int size = 0;

    /**
     * 构造顺序表
     */
    public MyArray(){
        arr = new int[10];
    }

    public MyArray(int n){
        arr = new int[n];
    }

    public String toString(){
        String str = "[";
        for (int i = 0; i < size; i++) {
            str += arr[i];
            if(i != size - 1){
                str += ",";
            }
        }
        str += "]";
        return str;
    }

    /**
     * 插入
     * @param data
     */
    //尾插
    public void pushBack(int data){
        pushInsert(size,data);
    }
    //头插
    public void pushFront(int data){
        pushInsert(0,data);
    }
    //中间插入
    public void pushInsert(int index,int data){
        checkCapacity();
        if(index < 0 || index > size){
            System.err.println("input error");
            return;
        }

        for (int i = size; i > index ; i--) {
            arr[i] = arr[i - 1];
        }
        arr[index] = data;
        size++;
    }
    //检查空间
    private void checkCapacity() {
        if(size == arr.length){
            int newArr[] = Arrays.copyOf(arr,size * 2);
            arr = newArr;
        }
    }

    /**
     * 查找
     * @param value
     * @return
     */
    //查看当前数组中是否存在该数
    public boolean contains(int value){
        for (int i = 0; i < size; i++) {
            if(value == arr[i]){
                return true;
            }
        }
        return false;
    }
    //根据索引取得相应位置元素
    public int get(int index){
        if(index < 0 || index > size){
            System.err.println("input error");
            return -1;
        }
        return arr[index];
    }
    //查找对应元素的下标
    public int getByValue(int value){
        for (int i = 0; i < size; i++) {
            if(value == arr[i]){
                return i;
            }
        }
        return -1;
    }

    /**
     * 删除元素
     */
    //头删
    public void removeFront(){
        removeIndex(0);
    }
    //尾删
    public void removeBack(){
        removeIndex(size - 1);
    }
    //根据索引删除元素
    public void removeIndex(int index){
        if(index < 0 || index > size){
            System.err.println("input error");
            return;
        }
        //后面size--了,不需要对最后一个元素进行前移
        for (int i = index; i < size - 1; i++) {
            arr[i] = arr[i + 1];
        }
        size--;
    }
    //删除数组中第一个元素值为value的元素
    public void removeValueOnce(int value){
        int index = getByValue(value);
        if(index == -1){
            System.out.println("该数组没有该值");
            return;
        }
        removeIndex(index);
    }
    //删除数组中所有值为value的元素
    public void removeValueAll(int value){
        int index = getByValue(value);
        if(index == -1){
            System.out.println("该数组没有该值");
            return;
        }
//        while(arr[index] == value && index != size){
//            removeIndex(index);
//        }
        //考虑当有相同连续的元素，往后移会跳过该删的数
        for (int i = index; i < size; i++) {
            if(arr[i] == value){
                removeIndex(i);
                i--;
            }
        }
    }
    /**
     * 查找元素
     */
    public int set(int index,int newData){
        if(index < 0 || index > size){
            System.err.println("input error");
            return -1;
        }
        int temp = arr[index];
        arr[index] = newData;
        return  temp;
    }
}
